package com.qf.smartplatform.service.Impl;/*
*王浩政 
*whz
2022/9/14
21:06
*小米商城
*/

import com.qf.smartplatform.cache.CategoryCache;
import com.qf.smartplatform.constans.ResultCode;
import com.qf.smartplatform.exceptions.AddDataException;
import com.qf.smartplatform.mapper.CategoryMapper;
import com.qf.smartplatform.pojo.SysCategory;
import com.qf.smartplatform.pojo.SysUserInfo;
import com.qf.smartplatform.service.CategoryService;
import com.qf.smartplatform.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.util.List;
import java.util.stream.Collectors;


@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {

    private CategoryCache categoryCache;
  private CategoryMapper categoryMapper;

  @Autowired
    public void setCategoryCache(CategoryCache categoryCache) {
        this.categoryCache = categoryCache;
    }



    @Autowired
    public void setCategoryMapper(CategoryMapper categoryMapper) {
        this.categoryMapper = categoryMapper;
    }

    @Override
    public void addCategory(SysCategory category) {

        //校验数据，数据现在通过我们的注解来校验
        //设置相关数据
        //设置创建者为当前登录用户，我们登录的数据在session中保存着，所以我们可以从session中获取
        SysUserInfo userInfo = SecurityUtils.getLoginUser();
        category.setCreateBy(userInfo.getUsername());
        //添加之前先查询数据是否存在
        SysCategory sysCategory = categoryMapper.findByCategoryName(category.getCategoryName());
        //判断查询出来的分类是不是被删除了，如果是删除了就增加新的数据，如果没有就抛出异常
        //老的数据重命名，新的数据用正常的名字，原因是新的用的比较多，老的分类到最后没有使用的情况下就可以真的不适用了

//        Assert.isNull(sysCategory,()->{
//            throw new AddDataException("你以为呢，分类已经存在啦", ResultCode.DATA_ALREADY_EXIST);
//        });
        if(sysCategory!=null&&sysCategory.getStatus()==1){
            //抛出异常
        }else if(sysCategory.getStatus()==0){
            //存在但是被删除了
            //将老的分类的名字换掉，但是为了避免使用老设备的用户产生异或，我们可以更新带有特殊字符的名字，返回的时候将特殊字符去掉
            sysCategory.setCategoryName(sysCategory.getCategoryName()+"teshuzifu");
            //更新数据
            sysCategory.setUpdateBy(userInfo.getUsername());
            categoryMapper.updateCategory(sysCategory);
        }
        categoryMapper.addCategory(category);
    }

    @Override
    public List<SysCategory> findAllCategories() {
        //查询缓存，但是注意我们查询所有数据的时候应该是返回有效的缓存
        List<SysCategory> categoryList = categoryCache.getCategoryList();
        //返回有效的数据
        categoryList.stream().filter(category -> category.getStatus()==1).collect(Collectors.toList());
    }
}


















